/**
 * 表单验证规则工具类
 * 包含通用验证函数和各业务表单的验证规则配置
 */

// 常用正则表达式常量
const REG_EXP = {
    // 手机号：支持13-19开头的11位数字
    PHONE: /^1[3-9]\d{9}$/,
    // 邮箱：支持大多数常见邮箱格式，包括多级域名
    EMAIL: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(\.[a-zA-Z]{2,})?$/,
    // 验证码：6位数字
    VERIFY_CODE: /^\d{6}$/,
    // 工号：6-10位数字
    WORK_ID: /^\d{6,10}$/,
    // 用户名：3-12位字符（字母、数字、下划线）
    USER_NAME: /^[a-zA-Z0-9_]{3,12}$/,
    // 密码：6-18位字符（支持字母、数字、特殊符号）
    PASSWORD: /^.{6,18}$/
};

/**
 * 基础验证函数（通用，可跨组件复用）
 */

/**
 * 验证密码一致性
 * @param {Object} form - 表单对象，需包含passWord字段
 * @returns {Function} 验证函数
 */
export const validatePasswordConsistency = (form) => {
    return (rule, value, callback) => {
        if (!value) {
            callback(new Error('请确认密码'));
        } else if (value !== form.passWord) {
            callback(new Error('两次输入的密码不一致'));
        } else {
            callback();
        }
    };
};

/**
 * 验证手机号格式
 * @param {Object} rule - 验证规则
 * @param {string} value - 待验证值
 * @param {Function} callback - 回调函数
 */
export const validatePhoneNumber = (rule, value, callback) => {
    if (!value) {
        callback(new Error('请输入手机号'));
    } else if (!REG_EXP.PHONE.test(value)) {
        callback(new Error('请输入正确的11位手机号（如：13800138000）'));
    } else {
        callback();
    }
};

/**
 * 验证邮箱格式
 * @param {Object} rule - 验证规则
 * @param {string} value - 待验证值
 * @param {Function} callback - 回调函数
 */
export const validateEmailAddress = (rule, value, callback) => {
    if (!value) {
        callback(new Error('请输入邮箱'));
    } else if (!REG_EXP.EMAIL.test(value)) {
        callback(new Error('请输入正确的邮箱格式（如：example@domain.com）'));
    } else {
        callback();
    }
};

/**
 * 验证验证码格式（6位数字）
 * @param {Object} rule - 验证规则
 * @param {string} value - 待验证值
 * @param {Function} callback - 回调函数
 */
export const validateVerificationCode = (rule, value, callback) => {
    if (!value) {
        callback(new Error('请输入验证码'));
    } else if (!REG_EXP.VERIFY_CODE.test(value)) {
        callback(new Error('验证码必须为6位数字'));
    } else {
        callback();
    }
};

/**
 * 验证工号格式（6-10位数字）
 * @param {Object} rule - 验证规则
 * @param {string} value - 待验证值
 * @param {Function} callback - 回调函数
 */
export const validateWorkId = (rule, value, callback) => {
    if (!value) {
        callback(new Error('请输入工号'));
    } else if (!REG_EXP.WORK_ID.test(value)) {
        callback(new Error('工号必须为6-10位数字'));
    } else {
        callback();
    }
};

/**
 * 验证用户名格式（3-12位字符）
 * @param {Object} rule - 验证规则
 * @param {string} value - 待验证值
 * @param {Function} callback - 回调函数
 */
export const validateUserName = (rule, value, callback) => {
    if (!value) {
        callback(new Error('请设置用户名'));
    } else if (!REG_EXP.USER_NAME.test(value)) {
        callback(new Error('用户名必须为3-12位字符（支持字母、数字、下划线）'));
    } else {
        callback();
    }
};

/**
 * 验证密码格式（6-18位字符）
 * @param {Object} rule - 验证规则
 * @param {string} value - 待验证值
 * @param {Function} callback - 回调函数
 */
export const validatePassword = (rule, value, callback) => {
    if (!value) {
        callback(new Error('请设置密码'));
    } else if (!REG_EXP.PASSWORD.test(value)) {
        callback(new Error('密码长度必须为6-18位'));
    } else {
        callback();
    }
};

/**
 * 表单专属规则（按业务模块分类）
 */

/**
 * 登录表单验证规则
 */
export const loginRules = {
    workId: [
        {
            required: true,
            trigger: ['blur', 'input'],
            validator: validateWorkId
        }
    ],
    passWord: [
        {
            required: true,
            trigger: ['blur', 'input'],
            validator: validatePassword
        }
    ]
};

/**
 * 忘记密码表单验证规则
 */
export const forgotRules = {
    workId: [
        {
            required: true,
            trigger: ['blur', 'input'],
            validator: validateWorkId
        }
    ],
    email: [
        {
            required: true,
            trigger: ['blur', 'input'],
            validator: validateEmailAddress
        }
    ],
    verifyCode: [
        {
            required: true,
            trigger: ['blur', 'input'],
            validator: validateVerificationCode
        }
    ],
    newPass: [
        {
            required: true,
            trigger: ['blur', 'input'],
            validator: validatePassword
        }
    ]
};

/**
 * 注册表单验证规则（需动态传入表单对象）
 * @param {Object} registerForm - 注册表单对象
 * @returns {Object} 验证规则配置
 */
export const getRegisterRules = (registerForm) => {
    return {
        userName: [
            {
                required: true,
                trigger: ['blur', 'input'],
                validator: validateUserName
            }
        ],
        phone: [
            {
                required: true,
                trigger: ['blur', 'input'],
                validator: validatePhoneNumber
            }
        ],
        email: [
            {
                required: true,
                trigger: ['blur', 'input'],
                validator: validateEmailAddress
            }
        ],
        verifyCode: [
            {
                required: true,
                trigger: ['blur', 'input'],
                validator: validateVerificationCode
            }
        ],
        passWord: [
            {
                required: true,
                trigger: ['blur', 'input'],
                validator: validatePassword
            }
        ],
        confirmPass: [
            {
                required: true,
                trigger: ['blur', 'input'],
                validator: validatePasswordConsistency(registerForm)
            }
        ]
    };
};

// 导出正则表达式供外部使用
export const ValidationRegExp = REG_EXP;
